package com.lagou.firstStageFourthModel.Third;

import java.io.*;
import java.util.concurrent.Callable;

public class CopyFileTask implements Callable {

    private String fromPath; // 需要拷贝的目录
    private String toPath; // 拷贝到的目录

    public CopyFileTask() {
    }

    public CopyFileTask(String fromPath, String toPath) {
        this.fromPath = fromPath;
        this.toPath = toPath;
    }

    public String getFromPath() {
        return fromPath;
    }

    public void setFromPath(String fromPath) {
        this.fromPath = fromPath;
    }

    public String getToPath() {
        return toPath;
    }

    public void setToPath(String toPath) {
        this.toPath = toPath;
    }

    @Override
    public Object call() throws Exception {
        File fromFile = new File(fromPath);
        File[] files = fromFile.listFiles();

        // 先递归创建目录
        createDir(files, toPath);
        // 再递归创建目录中的文件
        createFile(files, toPath);
        return null;
    }

    /**
     * 创建目录 该方法只创建目录
     * @param files 需要复制的文件列表
     * @param path 需要复制到的目录
     */
    private void createDir(File[] files, String path) {
        for (File file : files) {
            // 如果是目录 则创建新的目录
            if (file.isDirectory()) {
                String str = path + "/" + file.getName();
                System.out.println("正在创建目录：" + str);

                // 创建新的目录
                File newDir = new File(str);
                if (!newDir.exists()) {
                    newDir.mkdir();
                }

                // 如果目录下还有文件或目录 递归创建目录
                if (file.listFiles().length != 0) {
                    createDir(file.listFiles(), str);
                }
            }
        }
    }

    /**
     * 创建文件 该方法只创建文件
     * @param files 需要复制的文件列表
     * @param path 需要复制到的目录
     */
    private void createFile(File[] files, String path) {
        for (File file : files) {
            String str = path + "/" + file.getName();
            // 如果是文件 创建新文件并复制文件内容
            if (file.isFile()) {
                BufferedInputStream bis = null;
                BufferedOutputStream bos = null;
                try {
                    bis = new BufferedInputStream(new FileInputStream(file.getAbsoluteFile()));
                    bos = new BufferedOutputStream(new FileOutputStream(str));

                    System.out.println("正在复制文件：" + str);

                    // 缓冲区 拷贝文件
                    byte[] bArr = new byte[1024];
                    int res = 0;

                    while ((res = bis.read(bArr)) != -1) {
                        bos.write(bArr, 0, res);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (null != bis) {
                        try {
                            bis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    if (null != bos) {
                        try {
                            bos.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }

            // 如果是目录 递归获取下一层的文件
            if (file.isDirectory() && file.listFiles().length != 0) {
                createFile(file.listFiles(), str);
            }
        }
    }
}
